<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    //     js引擎运行js分为两个步骤，1预解析2.代码执行
    //     1预解析会把js中所有var还有function提升到当前作用域最前面
    //     2，代码执行由上往下，预解析分为变量预解析（变量提升）和函数预解析（函数提升）
    //     1，变量提升 就是把所有变量提升到当前作用域最前面，不提升赋值操作
    // 2函数提升，只把声明提升到前面，但不赋值
    // 2.函数表达式调用需要写在函数表达式声明的后面
    // fn()
    // function fn()//不会出错，因为会把函数这部分生命的提升到最前面
    // {
    //   console.log(11);
    // }
    // var fun()//会报错
    // var fun = function () {
    //   console.log(22);
    // }
    //相当于执行以下代码
    // var fun 
    // fun()//错误，因为值声明了，但没有写作用，所以会报错
    // fun=function(){
    //   log(22)
    // }、



    // var num = 10;
    // fun()
    // function fun() {
    //   console.log(num);
    //   var num = 20
    // }
    // // 相当于执行
    // var num;
    // function fun() {//函数内部也需要提升变量
    //  var num
    //   console.log(num);//根据作用域链就近原则，，离他最近的是num没有赋值，所以是undefined
    //    num = 20
    // }
    // num=10;
    // fun()

    f1()
    console.log(c);
    console.log(b);
    console.log(a);//因为别的都是全局变量，只有他是局部变量，所以他没有声明，找不到他，所以只有最后一个是undefined
    function f1() {
      var a = b = c = 9//相当于 var a=9;b=9;c=9//也就是b和c直接赋值，没有var 也就是相当于全局变量
      console.log(c);
      console.log(b);
      console.log(a);
    }

  </script>
</head>

<body>

</body>

</html>